// 导出常规变量
export const POP = "POP";
export const PUSH = "PUSH";
export const REPLACE = "REPLACE";
export const PopStateEvent = 'popstate';
export const HashChangeEvent = 'hashchange';

//! 工具函数处理字符串边界处理

/**
 * 产生指定长度随机字符串
 * @param {*} len 
 */
export function createKey(len = 4) {
    return Math.random().toString(36).slice(2, 2 + Number(len));
}

/**
 * 去除最后一个斜杠
 * @param {*} path 
 * @returns 
 */
export function stripTrailingSlash(path) {
    return path.charAt(path.length - 1) === '/' ? path.slice(0, -1) : path;
}

/**
 * 路径前面添加斜杠
 * @param {*} path 
 * @returns 
 */
export function addLeadingSlash(path) {
    return path.charAt(0) === '/' ? path : '/' + path;
}

/**
 * 是否包含基础路径
 * @param {*} path 
 * @param {*} prefix 
 * @returns 
 */
export function hasBasename(path, prefix) {
    return new RegExp('^' + prefix + '(\\/|\\?|#|$)', 'i').test(path);
}

/**
 * 去除基础路径
 * @param {*} path 
 * @param {*} prefix 
 * @returns 
 */
export function stripBasename(path, prefix) {
    return hasBasename(path, prefix) ? path.substr(prefix.length) : path;
}

/**
 * 是否支持 history
 * @returns 
 */
export function supportsHistory() {
    var ua = window.navigator.userAgent;
    if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) return false;
    return window.history && 'pushState' in window.history;
}

/**
 * 判断是否为 ie 浏览器(ie 低版本不支持 h5 history 模式)
 * @returns 
 */
export function supportsPopStateOnHashChange() {
    return window.navigator.userAgent.indexOf('Trident') === -1;
}

/**
 * 火狐如果将go与哈希历史一起使用会导致整个页面重新加载
 */
export function supportsGoWithoutReloadUsingHash() {
    return window.navigator.userAgent.indexOf('Firefox') === -1;
}

/**
 * 获取 hash 字符串数据
 * @returns 
 */
export function getHashPath() {
    //? 注意不使用 window.location.hash 是因为兼容性考虑(不考虑兼容性可以直接使用)
    const href = window.location.href;
    const hashIndex = href.indexOf('#');
    return hashIndex === -1 ? '' : href.substring(hashIndex + 1);
}